package leetCode.Test1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author zwei
 * @create 2024-08-03 9:18
 */
public class threeSum {
    public static void main(String[] args) {
        int []nums={-1,0,1,2,-1,-4};
        List<List<Integer>>result=threeSum(nums);
        System.out.println(result);
    }


    public static List<List<Integer>> threeSum(int[] nums){
        int n=nums.length;
        Arrays.sort(nums);
        List<List<Integer>>result=new ArrayList<>();
        //枚举a
        for (int first=0;first<n;first++){
            //需要和上一次枚举的数不同
            if (first>0&&nums[first]==nums[first-1]){
                continue;
            }
            //c对应的指针初始指向数组的最右端
            int third=n-1;
            int target=-nums[first];
            //枚举b
            for (int second=first+1;second<n;second++){
                //需要和上一次枚举的数不同
                if (second>first+1&&nums[second]==nums[second-1]){
                    continue;
                }
                //需要保证b的指针在c的指针的左侧
                while (second<third&&nums[second]+nums[third]>target){
                    third--;
                }
                //如果指针重合，随着b后续的增加
                //就不会有满足a+b+c=0并且b<c的c了，可以退出循环
                if (second==third){
                    break;
                }
                if (nums[second]+nums[third]==target){
                    List<Integer>list=new ArrayList<>();
                    list.add(nums[first]);
                    list.add(nums[second]);
                    list.add(nums[third]);
                    result.add(list);
                }
            }
        }
        return result;
    }
    public static List<List<Integer>> threeSum3(int[] nums) {
        List<List<Integer>>result=new ArrayList<>();
        int length = nums.length;
        for (int i=0;i<length;i++){
            for (int j=i+1;j<length;j++){
                for (int k=j+1;k<length;k++){
                    if (nums[i]+nums[j]+nums[k]==0){
                        List<Integer>list=new ArrayList<>();
                        list.add(nums[i]);
                        list.add(nums[j]);
                        list.add(nums[k]);
                        result.add(list);
                    }
                }
            }
        }
        return result;
    }
}
